package com.atguigu.spzx.pay.service.impl;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.atguigu.spzx.common.exception.GuiguException;
import com.atguigu.spzx.model.entity.pay.PaymentInfo;
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import com.atguigu.spzx.pay.properties.AlipayProperties;
import com.atguigu.spzx.pay.service.AlipayService;
import com.atguigu.spzx.pay.service.PaymentInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;

@Service
@Slf4j
public class AlipayServiceImpl implements AlipayService {

    @Autowired
    PaymentInfoService paymentInfoService;

    @Autowired
    AlipayProperties alipayProperties;

    @Autowired
    AlipayClient alipayClient;

    @Override
    public String submitAlipay(String orderNo) throws AlipayApiException {
        //保存支付记录(调用支付宝扣款前，需要商家保存支付信息。)
        PaymentInfo paymentInfo = paymentInfoService.savePaymentInfo(orderNo);

        //创建API对应的request
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();

        // 同步回调: 通知用户支付成功
        alipayRequest.setReturnUrl(alipayProperties.getReturnPaymentUrl());

        // 异步回调：通知商家服务端支付成功。商家服务端需要完成一些业务逻辑（例如：修改支付状态，减少库存，增加销量等），完成业务后需要返回给支付宝服务器端"success"单词，表示交易结束。
        // 返回 "failure"单词表示交易失败。
        // 如果商家没有返回给支付宝服务器"success"单词,那么，支付宝服务器会异步通知8次：  通知的间隔频率为：4m、10m、10m、1h、2h、6h、15h
        alipayRequest.setNotifyUrl(alipayProperties.getNotifyPaymentUrl());

        // 准备请求参数 ，声明一个map 集合
        HashMap<String, Object> map = new HashMap<>();
        map.put("out_trade_no",paymentInfo.getOrderNo()); //订单编号
        map.put("product_code","QUICK_WAP_WAY"); //手机网页支付
        //map.put("total_amount",paymentInfo.getAmount());
        map.put("total_amount",new BigDecimal("0.01")); //注意 注意  注意
        map.put("subject",paymentInfo.getContent()); //各个订单项 商品名称拼串
        alipayRequest.setBizContent(JSON.toJSONString(map));  //业务内容

        // 发送请求
        AlipayTradeWapPayResponse response = alipayClient.pageExecute(alipayRequest);
        if(response.isSuccess()){
            log.info("调用成功");
            return response.getBody();//支付form表单
        } else {
            log.info("调用失败");
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }
    }
}
